function MVVM(options) {
	/*
   1. options:{
            el: "#app",
            data: {
            msg: "hello mvvm",
            person:{
                name:"xiaoming",
                msg:"123"
            },
            }
        }
    */
	//2. this=>vm实例对象
	this.$options = options;

	var data = (this._data = this.$options.data);

	//3. 保存this在me中
	var me = this;
	Object.keys(data).forEach(function (key) {
		// 为me身上添加与data一样属性与方法，为直系属性代理
		// 为了开发中更加方便读取data数据
		me._proxy(key);
	});
	// ['msg', 'person'].forEach(function (key) {
	// 4.	me._proxy(msg);
	// });

	//8.数据劫持
	observe(data, this);
	// observe(this._data, vm);

	// 9.模板解析
	this.$compile = new Compile(options.el || document.body, this);
	// this.$compile = new Compile('#app || document.body, vm);
}

MVVM.prototype = {
	$watch: function (key, cb, options) {
		new Watcher(this, key, cb);
	},
	// 5.	me._proxy(msg);
	_proxy: function (key) {
		//6. me=vm
		var me = this;
		// 7.vm实例添加属性与get,set方法
		Object.defineProperty(me, key, {
			configurable: false, //不能重复定义
			enumerable: true, //可以遍历
			get: function proxyGetter() {
				return me._data[key];
			},
			set: function proxySetter(newVal) {
				me._data[key] = newVal;
			},
		});

		/*
        Object.defineProperty用于定义实行
        Object.defineProperty(vm, msg, {
			configurable: false, //不能重复定义
			enumerable: true, //可以遍历
        定义get和set方法
			get: function proxyGetter() {
				return me._data[msg];
			},
			set: function proxySetter(newVal) {
				me._data[msg] = newVal;
			},
		});

        */
	},
};
